//package cn.pa4j.utils;
//
//import act.Act;
//import act.app.App;
//import act.app.AppClassLoader;
//import act.boot.app.FullStackAppBootstrapClassLoader;
//import cn.hutool.core.convert.Convert;
//import cn.hutool.core.convert.impl.ArrayConverter;
//import cn.hutool.core.io.FileUtil;
//import cn.hutool.core.util.ArrayUtil;
//import cn.hutool.core.util.ClassUtil;
//import cn.hutool.json.JSONUtil;
//import cn.pa4j.pojo.Jar;
//import cn.pa4j.pojo.JarClass;
//import cn.pa4j.pojo.JarMethod;
//import cn.pa4j.pojo.Port;
//import org.mindrot.jbcrypt.BCrypt;
//import sun.misc.URLClassPath;
//
//import java.io.File;
//import java.io.IOException;
//import java.lang.reflect.Field;
//import java.lang.reflect.InvocationTargetException;
//import java.lang.reflect.Method;
//import java.net.URL;
//import java.net.URLClassLoader;
//import java.util.ArrayList;
//import java.util.Enumeration;
//import java.util.Iterator;
//import java.util.List;
//import java.util.jar.JarEntry;
//import java.util.jar.JarFile;
//
//public class LpUtil {
//
//    private static String[] OBJMETHODS = {"wait", "equals", "toString", "hashCode", "getClass", "notify", "notifyAll"};
//
//    public static String hashpw(String password) {
//        return BCrypt.hashpw(password, BCrypt.gensalt());
//    }
//
//    public static boolean checkpw(String password, String hashed) {
//        return BCrypt.checkpw(password, hashed);
//    }
//
//    /**
//     * 格式化Bean或List<Bean>为json字符串
//     *
//     * @param object
//     * @return 格式化后的字符串
//     */
//    public static String formatObj(Object object) {
//        String jsonStr = null;
//        if (object instanceof Iterator<?>) {
//            jsonStr = JSONUtil.parseArray(object).toString();
//        } else {
//            jsonStr = JSONUtil.parseObj(object).toString();
//        }
//        return JSONUtil.formatJsonStr(jsonStr);
//    }
//
//    /**
//     * 加载全部jar，获取方法
//     *
//     * @return
//     */
//    public static List<Jar> loadJars() {
//        List<Jar> jarList = new ArrayList<>();
//        File root = FileUtil.file("upload");
//        List<File> files = FileUtil.loopFiles(root);
//        URL[] urls = (URL[]) new ArrayConverter(URL[].class).convert(files, null);
//        URLClassLoader myClassLoader = new URLClassLoader(urls, Thread.currentThread()
//                .getContextClassLoader());
//        Jar jar = null;
//        JarClass clazz = null;
//        for (File file : files) {
//            jar = new Jar();
//            jar.setName(file.getName());
//            JarFile jarFile = null;
//            try {
//                jarFile = new JarFile(file);
//
//                Enumeration<JarEntry> entries = jarFile.entries();
//                while (entries.hasMoreElements()) {
//                    JarEntry entry = entries.nextElement();
//                    if (entry.getName().contains(".class")) {
//                        String name = entry.getName().replace(".class", "").replace("/", ".");
//                        clazz = new JarClass();
//                        clazz.setName(name);
//                        System.out.println(name);
//                        java.lang.Class<?> myClass = null;
//                        try {
//                            myClass = myClassLoader.loadClass(name);
//                            Method[] methods = myClass.getMethods();
//                            for (Method method : methods) {
//                                if (!ArrayUtil.contains(OBJMETHODS, method.getName())) {
//                                    clazz.getMethodList().add(new JarMethod(method.getName(), method.getParameterCount()));
//                                }
//                            }
//                        } catch (ClassNotFoundException e) {
//                        } catch (NoClassDefFoundError e) {
//                        }
//                        jar.getClassList().add(clazz);
//                    }
//                }
//                jarList.add(jar);
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//        return jarList;
//    }
//
//    public static String invoke(Port port, String arg) {
//        List<File> files = FileUtil.loopFiles("upload", pathname -> pathname.getName().endsWith(".jar") ? true : false);
//        URL[] urls = (URL[]) new ArrayConverter(URL[].class).convert(files, null);
//        ClassLoader myClassLoader = Act.class.getClassLoader();
////                new AppClassLoader(App.instance());
////                ucp.addURL(url);
////                new URLClassLoader(urls, Thread.currentThread()
////                .getContextClassLoader());
//        Class<?> myClass;
//        Method method;
//        Object invoke = null;
//        try {
//            Field ucp = ClassUtil.getDeclaredField(myClassLoader.getClass(), "ucp");
//            ucp.setAccessible(true);
//            URLClassPath u = (URLClassPath) ucp.get(myClassLoader);
//            for (URL url : urls) {
//                u.addURL(url);
//            }
//            myClass = myClassLoader.loadClass(port.getClassName());
//            if (port.getParameterCount() == 1) {
//                method = myClass.getMethod(port.getMethodName(), String.class);
//                invoke = method.invoke(myClass.newInstance(), arg);
//            } else {
//                method = myClass.getMethod(port.getMethodName());
//                invoke = method.invoke(myClass.newInstance());
//            }
//        } catch (InstantiationException | NoSuchMethodException | IllegalAccessException | InvocationTargetException | ClassNotFoundException e) {
//            e.printStackTrace();
//        }
//        return Convert.toStr(invoke);
//    }
//}
